<?php
/**
 * 源代码整合工具
 * 扫描指定目录下的代码文件，只提取代码内容并生成到指定文件中
 */

class CodeIntegrator {
    private $supportedExtensions = [
        'php', 'html', 'css', 'js', 'py', 'java', 'cpp', 'c', 'h', 'sql', 'xml', 'json'
    ];
    private $excludeDirs = ['.git', 'node_modules', '__pycache__', 'vendor'];
    private $excludeFiles = ['composer.lock', 'package-lock.json'];
    
    /**
     * 设置支持的文件扩展名
     */
    public function setSupportedExtensions($extensions) {
        $this->supportedExtensions = $extensions;
    }
    
    /**
     * 设置要排除的目录
     */
    public function setExcludeDirs($dirs) {
        $this->excludeDirs = $dirs;
    }
    
    /**
     * 设置要排除的文件
     */
    public function setExcludeFiles($files) {
        $this->excludeFiles = $files;
    }
    
    /**
     * 扫描目录并收集文件
     */
    private function scanDirectory($dir, &$files) {
        if (!is_dir($dir)) {
            throw new Exception("目录不存在: $dir");
        }
        
        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
            RecursiveIteratorIterator::LEAVES_ONLY
        );
        
        foreach ($iterator as $file) {
            $filePath = $file->getRealPath();
            $relativePath = str_replace($dir . DIRECTORY_SEPARATOR, '', $filePath);
            
            // 检查是否在排除目录中
            $shouldExclude = false;
            foreach ($this->excludeDirs as $excludeDir) {
                if (strpos($relativePath, $excludeDir . DIRECTORY_SEPARATOR) === 0) {
                    $shouldExclude = true;
                    break;
                }
            }
            
            if ($shouldExclude) {
                continue;
            }
            
            // 检查是否在排除文件中
            $fileName = basename($filePath);
            if (in_array($fileName, $this->excludeFiles)) {
                continue;
            }
            
            // 检查文件扩展名
            $extension = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
            if (in_array($extension, $this->supportedExtensions)) {
                $files[] = $filePath;
            }
        }
    }
    
    /**
     * 读取文件内容
     */
    private function readFileContent($filePath) {
        if (!file_exists($filePath)) {
            return "";
        }
        
        return file_get_contents($filePath) . "\n\n";
    }
    
    /**
     * 整合代码文件（无任何文件信息）
     */
    public function integrate($sourceDirs, $outputFile, $options = []) {
        // 处理选项
        if (isset($options['extensions'])) {
            $this->supportedExtensions = $options['extensions'];
        }
        
        if (isset($options['exclude_dirs'])) {
            $this->excludeDirs = $options['exclude_dirs'];
        }
        
        if (isset($options['exclude_files'])) {
            $this->excludeFiles = $options['exclude_files'];
        }
        
        // 收集所有文件
        $allFiles = [];
        foreach ($sourceDirs as $dir) {
            $this->scanDirectory($dir, $allFiles);
        }
        
        // 去重
        $allFiles = array_unique($allFiles);
        
        // 创建输出文件
        $outputDir = dirname($outputFile);
        if (!is_dir($outputDir)) {
            mkdir($outputDir, 0755, true);
        }
        
        // 清空或创建输出文件
        file_put_contents($outputFile, "");
        
        // 逐个读取文件并写入
        $fileCount = 0;
        foreach ($allFiles as $filePath) {
            $fileContent = $this->readFileContent($filePath);
            file_put_contents($outputFile, $fileContent, FILE_APPEND | LOCK_EX);
            $fileCount++;
        }
        
        echo "整合完成！共处理 $fileCount 个文件。\n";
        echo "输出文件: $outputFile\n";
        
        return true;
    }
}

// 命令行参数处理
if (isset($argv) && count($argv) > 1) {
    // 检查参数数量
    if (count($argv) < 3) {
        echo "使用方法: php g.php <源目录1,源目录2,...> <输出文件>\n";
        echo "示例: php g.php ./codes ./output/code.txt\n";
        exit(1);
    }
    
    // 解析参数
    $sourceDirs = explode(',', $argv[1]);
    $outputFile = $argv[2];
    
    // 验证源目录
    foreach ($sourceDirs as $dir) {
        if (!is_dir($dir)) {
            echo "错误: 目录不存在 - $dir\n";
            exit(1);
        }
    }
    
    // 创建整合器实例并执行整合
    try {
        $integrator = new CodeIntegrator();
        $integrator->integrate($sourceDirs, $outputFile);
    } catch (Exception $e) {
        echo "错误: " . $e->getMessage() . "\n";
        exit(1);
    }
} else {
    // 如果没有参数，显示帮助信息
    echo "使用方法: php g.php <源目录1,源目录2,...> <输出文件>\n";
    echo "示例: php g.php ./codes ./output/code.txt\n";
}
?>